﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cars
{
	// Абстрактный класс "Автомобиль"
	// Его объекты нельзя создавать в программе
	public abstract class Car
	{
		public enum Colors { White, Red, Blue, Green, Khaki }
		private Colors _color;				// цвет авто
		protected int _maxSpeed;		// максимальная скорость
		private int _currentSpeed;			// максимальная скорость
		private int _seatingCapacity;		// число мест для сидения
		private int _weight;				// вес
		private int _year;					// год выпуска
		private double _price;				// цена
		private readonly int _wheelCount;	// количество колёс
		protected Wheel[] objWheel;			// массив колёс	  
		public string CarType {get; set;}

		public int MaxSpeed
		{
			get
			{
				return _maxSpeed;
			}
		}

		// конструктор для класса "Автомобиль"
		public Car()
		{
			_wheelCount = 4; // инициализируем readonly-поле
			Color = Colors.White;
			_maxSpeed = 0;
			Price = 10;
			ModelYear = 1900;
			CarType = "Unknown Model";
			CurrentSpeed = 0;
			objWheel = new Wheel[WheelCount];	// создадим в конструкторе 4 объекта Колесо

			for (int i = 0; i < WheelCount; i++)
			{
				objWheel[i] = new Wheel();
			}

		}


		public double Price
		{
			get
			{
				return _price;
			}
			set
			{
				if (value > 0)
					_price = value;
			}
		}

		public int ModelYear
		{
			get
			{
				return _year;
			}
			set
			{
                // Если (год > 1800) и меньше текущей даты
				if ((value > 1800) && (value <= DateTime.Today.Year))
					_year = value;
			}
		}

		public int Weight
		{
			get
			{
				return _weight;
			}
			set
			{
				if (value > 0)
					_weight = value;
			}
		}

		public int SeatingCapacity
		{
			get
			{
				return _seatingCapacity;
			}
			set
			{
				if (value > 0)
					_seatingCapacity = value;
			}
		}

		public Colors Color
		{
			get
			{
				return _color;
			}
			set
			{	
				// Если присваиваемое значение содержится в перечислении
				if (Enum.IsDefined(typeof(Colors), value))
					_color = value;
			}
		}

		// свойство только для чтения (устанавливаем значение только в конструкторе)
		public int WheelCount{
			get
			{
				return _wheelCount;
			}
		}

		// Friend-класс Колесо (входит в состав класса "Автомобиль")
        protected class Wheel
        {
            private double _radius;  // радиус колеса

			// конструктор по умолчанию
			public Wheel()
			{
				Radius = 10;
			}

			// конструктор перегруженный
			public Wheel(double radius)
			{
				Radius = radius;
				//_area = Area;
			}

			// свойство Radius
            public double Radius
            {
                get
                {
                    return _radius;
                }
                set
                {
                    if (value > 0)
                        _radius = value;
                }
            }

			// свойство Area (площадь колеса)
            public double Area
            {
                get
                {
					return CalculateArea(Radius);
                }
            }

			// Метод колеса расчитывающий площадь колеса по заданному радиусу
			private double CalculateArea(double radius)
            {
                return (radius * radius * Math.PI);                
            }          
        }

		public int CurrentSpeed
		{
			get
			{
				return _currentSpeed;
			}
			set
			{
				if (((_currentSpeed + value) <= 0) && (value != 0))
				{
				   _currentSpeed = 0;
				   Console.WriteLine("Машина остановлена");
				}
				else if ((value > _currentSpeed) && (value < MaxSpeed))
				{
					if (_currentSpeed == 0)
						Console.WriteLine("Начинаю движение к заданной цели...");

					_currentSpeed = value;
					Console.WriteLine("Скорость машины увеличена до " + value + " км/ч");
				}
				else if ( value < MaxSpeed)
				{
					_currentSpeed = value;
					Console.WriteLine("Скорость машины снижена до " + value + " км/ч");
					if (_currentSpeed == 0)
						Console.WriteLine("Приехали!");
				}
				else
				if (value != 0)
				{
					// Если скорость военной машины задаётся  > максимальной
					// выставим максимальную и выведем сообщение
					_currentSpeed = MaxSpeed;
					Console.WriteLine("Достигнута максимальная скорость = " + _maxSpeed + " км/ч");
				}
			}
		}
	}
}
